package com.itheima.advance.reflect.demo02;

import java.lang.reflect.Constructor;

/**
 * 通过反射技术去获取某一个类所对应的构造方法
 */
public class ReflectDemo01 {

    public static void main(String[] args) throws Exception {

        // 1. 获取Student类所对应的字节码文件对象 ---> Class对象
        Class studentClazz = Class.forName("com.itheima.advance.reflect.demo02.Student");

        // 2. 调用Class类中的方法获取构造方法
        /**
         * Constructor<?>[] getConstructors()：返回所有公共构造方法对象的数组
         * Constructor<?>[] getDeclaredConstructors()：返回所有构造方法对象的数组
         * Constructor<T> getConstructor(Class<?>... parameterTypes)：返回单个公共构造方法对象
         * Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)：返回单个构造方法对象
         */
        // Constructor<?>[] getConstructors()：返回所有公共构造方法对象的数组
        Constructor[] constructors = studentClazz.getConstructors();
        for(Constructor con : constructors) {
            System.out.println(con);
        }

        System.out.println("--------------------------------------------------------");

        // Constructor<?>[] getDeclaredConstructors()：返回所有构造方法对象的数组
        Constructor[] declaredConstructors = studentClazz.getDeclaredConstructors();
        for(Constructor constructor : declaredConstructors) {
            System.out.println(constructor);
        }

        System.out.println("--------------------------------------------------------");

        // Constructor<T> getConstructor(Class<?>... parameterTypes)：返回单个公共构造方法对象
        /**
         * parameterTypes: 这个参数需要的是指定的构造方法上所定义的形式参数的Class类型
         */
        Constructor constructor = studentClazz.getConstructor();
        System.out.println(constructor);

        System.out.println("--------------------------------------------------------");

        Constructor con = studentClazz.getConstructor(String.class, int.class);// 每一个基本数据类型我们都可以通过静态的class属性进行获取其对应的Class类型
        System.out.println(con);

        System.out.println("--------------------------------------------------------");

        // Constructor con2 = studentClazz.getConstructor(String.class);    // 不能获取私有的构造方法
        // System.out.println(con2);

        // Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)：返回单个构造方法对象
        Constructor con2 = studentClazz.getDeclaredConstructor(String.class);
        System.out.println(con2);
    }

}
